package main

import (
	"fmt"
	"reflect"
)

// 定长，且类型一致的集合

func C1() {
	// 第一种 声明一个数组, 可存储3个元素, 当没有定义值时， 所有元素为类型的默认值
	var numbers [3]int
	numbers[0] = 1
	numbers[1] = 2
	numbers[2] = 3
	fmt.Println(numbers)

	// 第二种 声明一个数组 定义其中元素的值
	var numbers2 = [3]int{4, 5, 6}
	fmt.Println(numbers2)

	//第三种方式 定义其中某个位置的元素的值
	var number3 = [10]int{0: 1, 3: 89, 6: 66}
	fmt.Println(number3)

	// 第四种方式 不定义长度
	var numbers4 = [...]int{141, 749, 5: 512}
	fmt.Println(numbers4)
}

// 指针类型的数组
func C2() {
	// 声明一个指针类型的 数组
	var number2 = new([]int)
	fmt.Println(&number2, reflect.TypeOf(number2))
}

// 数组的内存地址
func C3() {
	var numbers = [3]int8{1, 2, 3}
	// 他们的内存地址是根据类型占位连续的
	fmt.Printf("内存地址: %p\n", &numbers)
	fmt.Printf("第一个元素的内存地址: %p\n", &numbers[0])
	fmt.Printf("第二个元素的内存地址: %p\n", &numbers[1])
	fmt.Printf("第三个元素的内存地址: %p\n", &numbers[2])
}

// 数组中字符串的内存地址
func C4() {
	// 数组中，有几个元素就有几个指针
	// 每个指针中分别存储了对应字符串的长度和它的内存地址 (分别占8个字节， 一共16个字节)
	// 指针指向的内存地址才是存储字符转的内存块
	var strs = [3]string{"myc", "djr", "null"}

	for i, j := range strs {
		fmt.Println(i, &j)
	}

}
